#!/bin/bash
# 建议此脚本在 Ubuntu 系统中使用
# 优化后的脚本，支持多次运行，不会报错，输出详细日志，对文件操作进行判断

# 开启 xtrace 和 errexit，方便调试和确保脚本在出错时退出
set -xe

# 定义日志文件
LOG_FILE="/var/log/system_init.log"
echo "开始执行脚本，日志将记录在 $LOG_FILE" | tee -a $LOG_FILE

# 检查是否为 root 用户
if [[ $(id -u) != "0" ]]; then
    echo "Error: 请使用 root 用户运行此脚本" | tee -a $LOG_FILE
    exit 1
fi

# 定义变量
echo "----------- start 定义变量 ----------------" | tee -a $LOG_FILE
MY_YUMING="grgold.cn"
SERVER_IDC_NUM='2F_local'
SERVER_PHY_NUM=01
VM_NAME='base-server'
ADMIN_EMAIL='dengjs@grgold.cn'
SMTP_FROM='1106359626@qq.com'
SMTP_PASSWD=''  # 注意：这里需要填写正确的 SMTP 授权码
SMTP_SERVER='smtps://smtp.qq.com:465'
SMTP_USER='1106359626@qq.com'

# 读取命令行参数
INTERACTIVE_MODE=false
while getopts ":i:p:v:y:l:d:t" option; do
    case $option in
        i) SERVER_IDC_NUM=$OPTARG ;;
        p) SERVER_PHY_NUM=$OPTARG ;;
        v) VM_NAME=$OPTARG ;;
        y) MY_YUMING=$OPTARG ;;
        l) SMTP_PASSWD=$OPTARG ;;
        d) ADMIN_EMAIL=$OPTARG ;;
        t) INTERACTIVE_MODE=true ;;
        *) echo "无效的参数 $OPTARG" | tee -a $LOG_FILE ;;
    esac
done

# 如果启用了交互模式，则进行交互式输入参数
if [ "$INTERACTIVE_MODE" = true ]; then
    echo "----------- start 交互式输入参数 ----------------" | tee -a $LOG_FILE
    read -p "请输入服务器 IDC 编号 (默认: $SERVER_IDC_NUM): " input_idc
    input_idc=${input_idc:-$SERVER_IDC_NUM}
    SERVER_IDC_NUM=$input_idc

    read -p "请输入服务器物理编号 (默认: $SERVER_PHY_NUM): " input_phy
    input_phy=${input_phy:-$SERVER_PHY_NUM}
    SERVER_PHY_NUM=$input_phy

    read -p "请输入虚拟机名称 (默认: $VM_NAME): " input_vmname
    input_vmname=${input_vmname:-$VM_NAME}
    VM_NAME=$input_vmname

    read -p "请输入域名 (默认: $MY_YUMING): " input_yuming
    input_yuming=${input_yuming:-$MY_YUMING}
    MY_YUMING=$input_yuming

    read -p "请输入管理员邮箱 (默认: $ADMIN_EMAIL): " input_email
    input_email=${input_email:-$ADMIN_EMAIL}
    ADMIN_EMAIL=$input_email

    read -sp "请输入 SMTP 密码 (默认隐藏): " input_passwd
    input_passwd=${input_passwd:-$SMTP_PASSWD}
    SMTP_PASSWD=$input_passwd

    echo "----------- end 交互式输入参数 ----------------" | tee -a $LOG_FILE
fi

# 输出读取的参数
echo "读取的参数" | tee -a $LOG_FILE
echo "域名: $MY_YUMING" | tee -a $LOG_FILE
echo "IDC 机房编号: $SERVER_IDC_NUM" | tee -a $LOG_FILE
echo "物理服务器编号: $SERVER_PHY_NUM" | tee -a $LOG_FILE
echo "虚拟机名称: $VM_NAME" | tee -a $LOG_FILE
echo "管理员邮箱: $ADMIN_EMAIL" | tee -a $LOG_FILE
echo "SMTP 发件人: $SMTP_FROM" | tee -a $LOG_FILE
echo "SMTP 服务器: $SMTP_SERVER" | tee -a $LOG_FILE
echo "SMTP 用户: $SMTP_USER" | tee -a $LOG_FILE

# 创建必要的目录
echo "创建必要的目录" | tee -a $LOG_FILE
mkdir -p /data/backups /data/apps /data/docker_storage

# 设置 hostname
echo "设置 hostname" | tee -a $LOG_FILE
hostnamectl set-hostname "${SERVER_IDC_NUM}.${SERVER_PHY_NUM}.${VM_NAME}.${MY_YUMING}"

# 将变量写入 /etc/profile
echo "将变量写入 /etc/profile" | tee -a $LOG_FILE
cat >>/etc/profile <<EOF
# 自定义主机名称
export MY_YUMING=${MY_YUMING}
# IDC 机房编号
export SERVER_IDC_NUM=${SERVER_IDC_NUM}
# 物理服务器编号
export SERVER_PHY_NUM=${SERVER_PHY_NUM}
# 虚拟机名称
export VM_NAME=${VM_NAME}
# 管理员邮箱
export ADMIN_EMAIL=${ADMIN_EMAIL}

# SMTP 配置
export SMTP_FROM=${SMTP_FROM}
export SMTP_PASSWD=${SMTP_PASSWD}
export SMTP_SERVER=${SMTP_SERVER}
export SMTP_USER=${SMTP_USER}
EOF

# 重新加载 /etc/profile
echo "重新加载 /etc/profile" | tee -a $LOG_FILE
source /etc/profile

# 设置时区并同步时间
echo "设置时区并同步时间" | tee -a $LOG_FILE
timedatectl set-timezone Asia/Shanghai

# 更新系统并安装必要的工具
echo "更新系统并安装必要的工具" | tee -a $LOG_FILE
apt update -y
apt-get install -y gcc make autoconf vim sysstat net-tools netcat-openbsd iftop htop unzip nmap telnet bc psmisc apache2-utils shc ntpdate dos2unix git ncdu clamav clamav-daemon python3-pip python3-dev libffi-dev openssl

# 安装 jq 工具
echo "安装 jq 工具" | tee -a $LOG_FILE
if [ ! -f /usr/bin/jq ]; then
    wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
    chmod +x jq
    mv jq /usr/bin
else
    echo "jq 工具已安装，跳过此步骤" | tee -a $LOG_FILE
fi

# 安装 Docker
echo "安装 Docker" | tee -a $LOG_FILE
if ! command -v docker &>/dev/null; then
    apt install -y apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
    add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    apt update -y
    apt install -y docker-ce
    systemctl enable docker
    systemctl start docker
else
    echo "Docker 已安装，跳过此步骤" | tee -a $LOG_FILE
fi

# 生成 Docker 配置文件
echo "生成 Docker 配置文件" | tee -a $LOG_FILE
if [ ! -f /etc/docker/daemon.json ]; then
    sudo sh -c 'mkdir -p /etc/docker && cat >/etc/docker/daemon.json <<EOF
{
  "registry-mirrors" : [
    "https://docker.cloudlayer.icu",
    "https://func.ink",
    "https://docker.awsl9527.cn"
  ],
  "insecure-registries": ["harbor.example.com"],
  "log-driver": "json-file",
  "log-opts": {"max-size":"50m", "max-file":"3"},
  "data-root": "/data/docker_storage"
}
EOF'
else
    echo "Docker 配置文件已存在，跳过此步骤" | tee -a $LOG_FILE
fi

# 安装 Docker Compose
echo "安装 Docker Compose" | tee -a $LOG_FILE
if ! command -v docker-compose &>/dev/null; then
    pip3 install --upgrade pip
    pip3 uninstall cryptography -y
    pip3 install cryptography==3.4.8
    pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple/
else
    echo "Docker Compose 已安装，跳过此步骤" | tee -a $LOG_FILE
fi

# 安装 trash-cli 垃圾回收站
echo "安装 trash-cli 垃圾回收站" | tee -a $LOG_FILE